const User = require('../../model/User')
const User_img = require('../../model/User_Img')
    // 操作路径模块
const path = require('path')
    // 操作文件模块
const fs = require('fs')
    // 引入formidable
const formidable = require('formidable');
const moment = require('moment')

const config = require('config').get('web')

moment.locale('zh-cn')
module.exports = (req, res) => {
    // 导入生存随机数模块
    const stringRandom = require('string-random');

    // 创建表单解析对象
    const form = new formidable.IncomingForm()
        // 是否保留表单上传文件的后缀名 默认是false
    form.keepExtensions = true
        // 先设置文件存储的位置 后面会根据不同的用户吧文件移动打不同的文件夹
    form.uploadDir = path.join(__dirname, '../', '../', 'public', 'uploads')
        // 对表单进行解析
    form.parse(req, async(err, fields, files) => {
        //拿到扩展名
        const extname = path.extname(files['file'].name)
            // 旧的路径
        const oldpath = files['file'].path
            // 接收客户端传递过来的 key
        const key = fields.key
            // 判断是否传递
        if (!key) {
            res.sendResult(null, 400, '请传递 key ')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
                console.log('删除成功！');
            })
            return
        }
        // 查询 key 是否存在
        const findKey = await User.findOne({ where: { key } })
        if (!findKey) {
            res.sendResult(null, 400, 'key 不存在！')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
                console.log('删除成功！');
            })
            return
        }
        let size = files['file'].size / 1024
        size = size.toFixed(2)
        if ((size / 1024).toFixed(2) > 10) {
            res.sendResult(null, 400, '文件大小超出系统设定大小！')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
            })
            return
        }
        // 正则表达式
        const reg = /(.*)\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$/;
        // 判断上传的图片类型是否合格
        if (!reg.test(extname)) {
            res.sendResult(null, 400, '图片格式不合格！')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
            })
            return
        }
        let issize = (size / 1024).toFixed(2)
        issize = findKey.capacity - issize
        if (issize < 0) {
            res.sendResult(null, 400, '用户的容量不够！')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
                console.log('容量不够删除文件成功！');
            })
            return
        }
        // 文件不存在
        // 重新创建
        fs.mkdir(path.join(__dirname, '../', '../', 'public', findKey.username), (err) => {
                if (err) {
                    return
                }
                console.log('创建成功！');
            })
            // 新的路径
        const newpath = path.join(__dirname, '../', '../', 'public', findKey.username, stringRandom(10) + extname)
        var obj = {
            user_id: findKey.id,
            img_name: stringRandom(10) + path.extname(files['file'].name),
            img_path: newpath.replace(/\\/g, "/").split('public')[1],
            img_size: size,
            img_data: moment().format('YYYY-MM-DD HH:mm:ss'),
            img_url: config.domainName + newpath.replace(/\\/g, "/").split('public')[1]
        }
        const createUser_img = await User_img.create(obj)
        if (!createUser_img) {
            res.sendResult(null, 422, '创建失败')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
                console.log('删除成功！');
            })
            return
        }
        const editSize = await User.update({ capacity: issize }, { where: { id: findKey.id } })
        if (!editSize) {
            res.sendResult(null, 422, '发生未知错误！')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
                console.log('删除成功！');
            })
            return
        }

        // 将文件名称修改为 随机生存的字符串
        fs.rename(oldpath, newpath, function(err) {
            if (err) {
                // 删除
                fs.unlink(oldpath, (err) => {
                    if (err) {
                        throw err;
                    }
                    console.log('删除成功！');
                })
                throw Error('改名失败');
            }
        });
        res.sendResult({
            path: newpath.replace(/\\/g, "/").split('public')[1],
            url: config.domainName + newpath.replace(/\\/g, "/").split('public')[1],
            size: size,
        }, 200, '上传成功！')
    })
}